﻿using System;
using System.Data.Objects.DataClasses;
using System.Linq;
using System.Windows.Forms;
using MobileCommissionManagement.Common;

namespace MobileCommissionManagement.Controls
{
    public partial class EntityList : UserControl
    {
        private Controller _controller;

        #region Properties

        public Controller Controller
        {
            set
            {
                _controller = value;
                _controller.EntitySaved += delegate { SetGridDataSource(); };
                SetGridDataSource();
            }
        }

        #endregion

        public EntityList()
        {
            InitializeComponent();
            editToolStripMenuItem.Click += EditToolStripMenuItemClick;
            addToolStripMenuItem.Click += AddToolStripMenuItemClick;
            changeSituationToolStripMenuItem.Click += ChangeSituationToolStripMenuItemClick;
            gridView.DoubleClick += GridViewDoubleClick;
            contextMenuStrip.Opening += ContextMenuStripOpening;
        }

        #region Private Methods

        private void SetGridDataSource()
        {
            gridControl.DataSource = _controller.Entities;
            tiposEntidadeBindingSource.DataSource = _controller.EntityTypes;
            entidadesBindingSource1.DataSource = _controller.Entities;
        }

        private Entidades GetClone(Entidades entity)
        {
            var document = new Entidades
                               {
                                   IdEntidade = entity.IdEntidade,
                                   Nome = entity.Nome,
                                   Telemovel = entity.Telemovel,
                                   EMail = entity.EMail,
                                   SFID = entity.SFID,
                                   IdAgregador = entity.IdAgregador,
                                   IdTipoEntidade = entity.IdTipoEntidade,
                                   Activo = entity.Activo
                               };
            EntityCollection<EntidadeDetalhes> entityDetails = _controller.GetEntityDetails(entity.IdEntidade);
            if (entityDetails == null)
                return document;
            foreach (EntidadeDetalhes detail in entityDetails)
            {
                var entityDetail = new EntidadeDetalhes
                                       {
                                           Entidades = document,
                                           IdEntidadeDetalhe = detail.IdEntidadeDetalhe,
                                           DataFim = detail.DataFim
                                       };
                entityDetail.DataFim = detail.DataFim;
                entityDetail.DataInicio = detail.DataInicio;
                entityDetail.IdCoordenador = detail.IdCoordenador;
                entityDetail.IdOperador = detail.IdOperador;
                entityDetail.IdZona = detail.IdZona;
            }
            return document;
        }

        private static void UpdateEntityDetail(EntidadeDetalhes detail, EntidadeDetalhes entityDetail)
        {
            entityDetail.DataFim = detail.DataFim;
            entityDetail.DataFim = detail.DataFim;
            entityDetail.DataInicio = detail.DataInicio;
            entityDetail.IdCoordenador = detail.IdCoordenador;
            entityDetail.IdOperador = detail.IdOperador;
            entityDetail.IdZona = detail.IdZona;
        }

        private static EntidadeDetalhes GetEntityDetail(Entidades entity, int entityDetailId )
        {
            return entity.EntidadeDetalhes.FirstOrDefault(detail => detail.IdEntidadeDetalhe == entityDetailId);
        }

        private static void Merge(Entidades entity, Entidades document)
        {
            entity.Nome = document.Nome;
            entity.Telemovel = document.Telemovel;
            entity.EMail = document.EMail;
            entity.SFID = document.SFID;
            entity.IdAgregador = document.IdAgregador;
            entity.IdTipoEntidade = document.IdTipoEntidade;
            entity.Activo = document.Activo;
            foreach (EntidadeDetalhes detail in document.EntidadeDetalhes)
            {
                EntidadeDetalhes entityDetail;
                if(detail.IdEntidadeDetalhe < 0)
                {
                    entityDetail = new EntidadeDetalhes
                                       {
                                           Entidades = entity,
                                           IdEntidadeDetalhe = detail.IdEntidadeDetalhe
                                       };
                    UpdateEntityDetail(detail, entityDetail);
                    continue;
                }
                entityDetail = GetEntityDetail(entity, detail.IdEntidadeDetalhe);
                if (entityDetail == null)
                    entity.EntidadeDetalhes.Remove(entityDetail);
                else
                    UpdateEntityDetail(detail, entityDetail);                
            }
        }

        private void ShowEntity(Entidades entity)
        {
            Entidades document = GetClone(entity);
            var window = new Entity {Controller = _controller, Document = document};
            if (DialogResult.OK != window.ShowDialog())
                return;
            Merge(entity, window.Document);
            _controller.SaveEntity(entity);
        }

        #endregion

        void GridViewDoubleClick(object sender, EventArgs e)
        {
            var entity = (Entidades)gridView.GetRow(gridView.FocusedRowHandle);
            if (entity == null)
                return;
            ShowEntity(entity);
        }

        void EditToolStripMenuItemClick(object sender, EventArgs e)
        {
            var entity = (Entidades)gridView.GetRow(gridView.FocusedRowHandle);
            ShowEntity(entity);
        }

        void AddToolStripMenuItemClick(object sender, EventArgs e)
        {
            var entity = new Entidades {IdEntidade = -1, Nome = string.Empty, EMail = string.Empty, Activo = true};
            ShowEntity(entity);
        }

        void ChangeSituationToolStripMenuItemClick(object sender, EventArgs e)
        {
            var entity = (Entidades)gridView.GetRow(gridView.FocusedRowHandle);
            if (entity == null)
                return;
            entity.Activo = !entity.Activo;
            _controller.SaveEntity(entity);
        }

        void ContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)
        {
            var entity = (Entidades)gridView.GetRow(gridView.FocusedRowHandle);
            editToolStripMenuItem.Enabled = entity != null;
            changeSituationToolStripMenuItem.Enabled = entity != null;
            removeToolStripMenuItem.Enabled = false;
        } 
        
    }
}
